package com.zenithmind.chat.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

/**
 * 群组成员状态枚举 - 遵循开闭原则
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
public enum MemberStatus {
    
    /**
     * 已退出
     */
    EXITED(0, "已退出"),
    
    /**
     * 正常
     */
    NORMAL(1, "正常"),
    
    /**
     * 被踢出
     */
    KICKED(2, "被踢出"),
    
    /**
     * 待审核
     */
    PENDING(3, "待审核"),
    
    /**
     * 已禁言
     */
    MUTED(4, "已禁言"),
    
    /**
     * 已封禁
     */
    BANNED(5, "已封禁");

    /**
     * 状态码 - 用于数据库存储
     */
    @EnumValue
    @JsonValue
    private final Integer code;

    /**
     * 状态描述
     */
    private final String description;

    /**
     * 构造函数
     */
    MemberStatus(Integer code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 根据状态码获取枚举
     * 
     * @param code 状态码
     * @return 对应的枚举值
     */
    public static MemberStatus fromCode(Integer code) {
        if (code == null) {
            return NORMAL;
        }
        
        for (MemberStatus status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        
        throw new IllegalArgumentException("未知的成员状态码: " + code);
    }

    /**
     * 检查是否为正常状态
     * 
     * @return 是否正常
     */
    public boolean isNormal() {
        return this == NORMAL;
    }

    /**
     * 检查是否已退出
     * 
     * @return 是否已退出
     */
    public boolean isExited() {
        return this == EXITED;
    }

    /**
     * 检查是否被踢出
     * 
     * @return 是否被踢出
     */
    public boolean isKicked() {
        return this == KICKED;
    }

    /**
     * 检查是否待审核
     * 
     * @return 是否待审核
     */
    public boolean isPending() {
        return this == PENDING;
    }

    /**
     * 检查是否已禁言
     * 
     * @return 是否已禁言
     */
    public boolean isMuted() {
        return this == MUTED;
    }

    /**
     * 检查是否已封禁
     * 
     * @return 是否已封禁
     */
    public boolean isBanned() {
        return this == BANNED;
    }

    /**
     * 检查是否可以发言
     * 
     * @return 是否可以发言
     */
    public boolean canSpeak() {
        return this == NORMAL;
    }

    /**
     * 检查是否在群组中
     * 
     * @return 是否在群组中
     */
    public boolean isInGroup() {
        return this == NORMAL || this == PENDING || this == MUTED;
    }
}
